package br.gov.cemaden.library.model.previsao;

import br.gov.cemaden.library.model.Municipio;
import br.gov.cemaden.library.repository.previsao.PrevisaoTempoRepository;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

/**
 *
 * @author alan
 */
@Entity
@Table(name = "previsao_tempo", schema = "previsao")
@SequenceGenerator(name = "sequence", sequenceName = "previsao.previsao_tempo_sequence", schema = "previsao")
public class PrevisaoTempo implements Serializable {
    
    @Id
    @GeneratedValue(generator = "sequence", strategy = GenerationType.AUTO)
    @Column(name = "id_previsao_tempo")
    private Long id;
    
    @Temporal(TemporalType.TIMESTAMP)
    private Date datahora;
    
    /**
     * Period, from the beginning of the weather forecast, that this one is valid
     */
    private Integer periodo;
        
    private String condicao;
    
    private BigDecimal precipitacao;
    
    /**
     * Value in Celsius degrees
     */
    @Column(name = "temperatura_minima")
    private Double minima;
    
    /**
     * Value in Celsius degrees
     */
    @Column(name = "temperatura_maxima")
    private Double maxima;
    
    /**
     * Value in degrees
     */
    @Column(name = "direcao_vento")
    private Double direcaoVento;
    
    @Column(name = "intensidade_vento")
    private String intensidadeVento;
    
    /**
     * Value in meters/seconds
     */
    @Column(name = "velocidade_vento")
    private Integer velocidadeVento;
    
    @ManyToOne(optional = false)
    @JoinColumn(name = "id_municipio", referencedColumnName = "id_municipio", nullable = false)
    private Municipio municipio;
    
    @ManyToOne(optional = false)
    @JoinColumn(name = "id_previsao_tempo_aquisicao", referencedColumnName = "id_previsao_tempo_aquisicao")
    private AquisicaoTempo aquisicao;
    
    @Transient
    private PrevisaoTempoRepository repository;

    public PrevisaoTempo(){
        
    }
    
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Date getDatahora() {
        return datahora;
    }

    public void setDatahora(Date datahora) {
        this.datahora = datahora;
    }

    public Integer getPeriodo() {
        return periodo;
    }

    public void setPeriodo(Integer periodo) {
        this.periodo = periodo;
    }

    public String getCondicao() {
        return condicao;
    }

    public void setCondicao(String condicao) {
        this.condicao = condicao;
    }

    public BigDecimal getPrecipitacao() {
        return precipitacao;
    }

    public void setPrecipitacao(BigDecimal precipitacao) {
        this.precipitacao = precipitacao;
    }        

    public Double getMinima() {
        return minima;
    }

    public void setMinima(Double minima) {
        this.minima = minima;
    }

    public Double getMaxima() {
        return maxima;
    }

    public void setMaxima(Double maxima) {
        this.maxima = maxima;
    }

    public Double getDirecaoVento() {
        return direcaoVento;
    }

    public void setDirecaoVento(Double direcaoVento) {
        this.direcaoVento = direcaoVento;
    }

    public String getIntensidadeVento() {
        return intensidadeVento;
    }

    public void setIntensidadeVento(String intensidadeVento) {
        this.intensidadeVento = intensidadeVento;
    }        

    public Integer getVelocidadeVento() {
        return velocidadeVento;
    }

    public void setVelocidadeVento(Integer velocidadeVento) {
        this.velocidadeVento = velocidadeVento;
    }

    public Municipio getMunicipio() {
        return municipio;
    }

    public void setMunicipio(Municipio municipio) {
        this.municipio = municipio;
    }

    public AquisicaoTempo getAquisicao() {
        return aquisicao;
    }

    public void setAquisicao(AquisicaoTempo aquisicao) {
        this.aquisicao = aquisicao;
    }      

    public PrevisaoTempoRepository getRepository(EntityManager em) {
        if(repository == null)
            this.setRepository(new PrevisaoTempoRepository(em));
        return repository;
    }

    public void setRepository(PrevisaoTempoRepository repository) {
        this.repository = repository;
    }
    
    public PrevisaoTempo save(EntityManager em){
        if(em.isOpen())
            return getRepository(em).persist(this);
        return null;
    }
    
    @Override
    public String toString(){
        return String.format("%s %d %.2f %.2f %s", datahora.toString(), periodo, maxima, minima, municipio);
    }
    
}
